// 箭头函数中的this等同于普通语句中的this
// 注意： 下面的运行结果来自于浏览器，node中由于默认使用了严格模式，顶层被调函数中的this是undefined

// 定义一个全局变量
var a = 0;

// demo1
var obj =  {
  a: 1,
  b1: this.a,
  b2: () => this.a,
};

console.log(obj.b1);  // 0
console.log(obj.b2());  // 0

// demo2
(function fn(){
  var a = 2;
  console.log(this.a);  // 0

  const subf = ()=>this.a;
  console.log(subf()); // 0
})()

// demo3
var obj2 =  {
  a: 3,
  b1: function(){ return this.a;},
  b2: function(){ return ()=>this.a},
};
console.log(obj2.b1());  // 3
console.log(obj2.b2()());  // 3

// demo4
var obj3 =  {
  a: 4,
  b1: function(){ return this.a;},
  b2: function(){ return ()=> () => () => this.a},
};
console.log(obj4.b1());  // 4
console.log(obj4.b2()()()());  // 4

// demo5
function f0() {
  var a = 5;
  setTimeout(function() {
    var b1 = this.a;
    console.log(b1);  // 0
  }, 100);
  setTimeout(function() {
    var b2 = ()=> this.a;
    console.log(b2());  // 0
  }, 200);
}

f0(); // 0  0
f0.call({a: 6}); // 0  0

// demo6
function f1() {
  console.log(this.a);
  setTimeout(() => {
    console.log(this.a);
  }, 100);
}
f1(); // 0  0
f1.call({a: 7});  // 7  7

var bindf1 = f1.bind({a: 8}); 
bindf1(); // 8 8
